#include<stdio.h>
#include<string.h>
#include<errno.h>
#include<stdlib.h>
#include<unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

typedef void (*func_t)();

#define NUM 5
func_t handles[NUM+1];

void func_one()
{
    printf("这是任务1\n");
}
void func_two()
{
    printf("这是任务2\n");
}
void func_three()
{
    printf("这是任务3\n");
}
//注册
void regist(func_t h[],func_t f)
{
    int i=0;
    for(;i<NUM;i++)
    {
        if(h[i]==NULL) break;
    }
    if(i==NUM) return;
    h[i]=f;
    h[i+1]=NULL;
}
int main()
{
    //功能入数组
    regist(handles,func_one);
    regist(handles,func_two);
    regist(handles,func_three);
    pid_t id=fork();
    if(id==0)
    {
        int cnt=3;
        while(1)
        {
            printf("我是子进程,pid:%d,ppid:%d\n",getpid(),getppid());
            sleep(1);
            cnt--;
           // int a=10;
           // a/=0;
        }
        exit(1);
    }
    while(1)
    {
        int status=0;
        pid_t rid=waitpid(id,&status,WNOHANG);
        if(rid>0)
        {
            printf("wait success,rid:%d,exit code:%d,exit signal:%d\n",rid,WEXITSTATUS(status),status&0x7F);
            break;
        }
        else if(rid==0)
        {
            int i=0;
            //函数指针进行回调
            for(;handles[i];i++)
            {
                handles[i]();
            }
            printf("本轮调用结束，子进程没有退出\n");
            sleep(1);
        }
        else
        {
            printf("等待失败\n");
            break;
        }
    }
    
    //sleep(10);
   // int status=0;
   // pid_t rid=waitpid(id,&status,0);
   // if(rid>0)
   // {
   //     if(WIFEXITED(status))
   //         printf("wait success,rid:%d,exit code:%d,exit signal:%d\n",rid,WEXITSTATUS(status),status&0x7F);
   //     else
   //         printf("子进程异常退出\n");
   //     //printf("wait success,rid:%d,exit code:%d,exit signal:%d\n",rid,(status>>8)&0xFF,status&0x7F);
   // }
   // else
   // {
   //     printf("wait fail:%d:%s\n",errno,strerror(errno));
   // }
    return 0;
}

//void func()
//{
//    printf("func begin\n");
//    exit(40);
//    printf("func end\n");
//}
//int main()
//{
//    //func();
//    printf("main");
//    sleep(2);
//    _exit(23);
//
//   // for(int i=0;i<200;i++)
//   // {
//   //     printf("%d->%s\n",i,strerror(i));
//   // }
//   // //printf("hello Linux\n");
//   // FILE* fp=fopen("222.txt","r");
//   // if(fp==NULL) return errno;
//
//   // fclose(fp);
//   // return 0;
//}
